#include <iostream>
using namespace std;

// 人类
class Person{
    private:
        string name;
        int age;
    public:
        Person(){cout << "Person 无参构造" << endl;}
        Person(string n, int a):name(n), age(a){
            cout << "Person 有参构造" << endl;
        }
        ~Person(){cout << "Person 析构构造" << endl;}
        void show(){
            cout << "Person show" << endl;
            cout << name << endl;
            cout << age << endl;
        }
        // 父类提供的访问私有成员变量的成员函数
        string get_name(void){return name;}
        int get_age(void){return age;}
};

// 教师类
class Teacher:public Person{
    private:
        string course; // 所教课程
    public:
        Teacher(){cout << "Teacher 无参构造" << endl;}
        // 需要在子类的构造函数的初始化表中线性的调用父类的构造函数
        // 来完成 对 从父类中继承过来的成员 的初始化工作
        // 否则 默认会调用父类的无参构造来初始化这些成员
        Teacher(string n, int a, string c):Person(n, a), course(c){
            cout << "Teacher 有参构造" << endl;
        }
        ~Teacher(){cout << "Teacher 析构构造" << endl;}
        void show(){
            cout << "Teacher show" << endl;
            // cout << name << endl; // 不能直接访问父类的私有成员
            // cout << age << endl;  // 不能直接访问父类的私有成员
            
            // 通过父类提供的 public 或者 protected 权限函数访问时没问题的
            cout << get_name() << endl;
            cout << get_age() << endl;
            cout << course << endl;
        }
        void func(){
            cout << "Teacher func" << endl;
            show(); // 调用子类的show
            Person::show(); // 调用父类的show
        }
};


int main(int argc, const char *argv[]){
    Teacher t1("杨老师", 18, "嵌入式");
    t1.show(); // 子类 show
    t1.Person::show(); // 父类的 show

    cout << "---------------" << endl;
    t1.func();

    return 0;
}